package zw_301_400.zw_367_有效的完全平方数;

class Solution {

    public static void main(String[] args) {
        int n = 808201;
        boolean b = isPerfectSquare(n);
        System.out.println(b);
    }

    /**
     * 数学
     *
     * @param num
     * @return
     */
    public static boolean isPerfectSquare(int num) {
        int num1 = 1;
        while (num > 0) {
            num -= num1;
            num1 += 2;
        }
        return num == 0;
    }

    /**
     * 牛顿迭代法
     *
     * @param num
     * @return
     */
//    public static boolean isPerfectSquare(int num) {
//        double x0 = num;
//        while (true) {
//            double x1 = (x0 + num / x0) / 2;
//            if (x0 - x1 < 1e-6) {
//                break;
//            }
//            x0 = x1;
//        }
//        int x = (int) x0;
//        return x * x == num;
//    }


    /**
     * 双指针法
     *
     * @param num
     * @return
     */
//    public static boolean isPerfectSquare(int num) {
//        if (num < 0) return false;
//        if (num == 0 || num == 1) return true;
//        int left = 0, right = num;
//        while (left <= right) {
//            int mid = left + (right - left) / 2;
//            long square = (long) mid * mid;
//            if (square < num) left = mid + 1;
//            else if (square > num) right = mid - 1;
//            else return true;
//        }
//        return false;
//    }

    /**
     * 暴力法
     * （超时）
     *
     * @param num
     * @return
     */
//    public static boolean isPerfectSquare(int num) {
//        if (num == 0 || num == 1) return true;
//        if (num < 0) return false;
//        for (int i = 0; i < num / 2 + 1; i++) {
//            if (i * i == num) return true;
//        }
//        return false;
//    }
}
